package com.hxj.common.thread.event;

import com.hxj.common.thread.pojo.BizThreadPoolExt;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * @author Tz
 * @date 2024/02/23 17:16
 * @Description 线程池管理
 */
@Slf4j
@Component
public class DynamicThreadPoolManager {

    private final Map<String, BizThreadPoolExt> bizThreadPoolExtMap = new HashMap<>();

    /**
     * 注册线程池到管理器中
     * @param poolName         线程池名称
     * @param bizThreadPoolExt 线程池
     */
    public void registerThreadPool(String poolName, BizThreadPoolExt bizThreadPoolExt) {
        bizThreadPoolExtMap.put(poolName, bizThreadPoolExt);
    }

    /**
     * 释放所有线程池
     */
    public void shutdownAllThreadPools(){
        for (BizThreadPoolExt bizThreadPoolExt : bizThreadPoolExtMap.values()) {
            try {
                //关闭线程池
                bizThreadPoolExt.shutdown();
                //等待线程池内部的线程任务完成，并设置超时时间30秒
                boolean execFlag = bizThreadPoolExt.awaitTermination(30L, TimeUnit.SECONDS);
                if (execFlag) {
                    log.info("线程池：[{}] 已经停止, 该线程池已经关闭并且没有还在运行的线程", bizThreadPoolExt.getPoolName());
                } else {
                    log.info("线程池：[{}] 中可能还存在正在运行的线程", bizThreadPoolExt.getPoolName());
                }
            } catch (InterruptedException e) {
                if (!bizThreadPoolExt.isShutdown()) {
                    bizThreadPoolExt.shutdown();
                }
            }
//            bizThreadPoolExt.shutdown();
        }
    }
}
